理解崩溃转储
当 NW.js 崩溃时,将在磁盘上生成一个 minidump
文件 (.dmp
)。用户可以将其包含在错误报告中。您可以解码 minidump
文件以获取崩溃时的堆栈跟踪。因此,在某些情况下,找出 NW.js 出现的问题很有帮助。
要从 minidump
文件中提取堆栈跟踪,您需要三样东西:从崩溃中生成的 minidump (.dmp
) 文件、NW.js 二进制文件的符号文件以及 minidump_stackwalk
工具。
查找 Minidump 文件
当 NW.js 崩溃时,minidump 文件将在以下默认目录中生成
- Linux:
~/.config/<name-in-manifest>/Crash\ Reports/
- Windows:
%LOCALAPPDATA%\<name-in-manifest>\User Data\CrashPad
(在版本 < 0.21.5 中,它位于%LOCALAPPDATA%\Chromium\User Data\CrashPad
中,因为存在 bug #5248 ) - Mac:
~/Library/Application\ Support/<name-in-manifest>/CrashPad/
<name-in-manifest>
是 清单文件 中的 name
字段。
从 Linux Minidump 文件中剥离头文件
在 Linux 上生成的 Minidump 文件包含额外的文本格式头文件。在解码之前必须剥离这些头文件。Minidump 文件的实际内容以 MDMP
开头,后面跟着不可读的二进制文件。因此,只需删除 MDMP
之前的文本即可。
组织符号文件
发布的 NW.js 的符号文件包可以从 https://dl.nwjs.io/ 下载。
例如,在 Mac 上,使用 0.57.1
https://dl.nwjs.io/v0.57.1/nwjs-symbol-v0.57.1-osx-x64.zip
https://dl.nwjs.io/v0.57.1/nwjs-sdk-symbol-v0.57.1-osx-x64.zip
然后,您必须以 **正确的路径和正确的文件名** 组织符号文件,以便 minidump_stackwalk
工具可以使用它们。minidump_stackwalk
使用 简单符号提供程序 来查找符号文件。以下是它查找符号文件的方式。
该工具将尝试按照以下模式搜索 .sym
文件(对于 Mac,将 .breakpad
更改为 .sym
):
{SYMBOLS_ROOT}/{DEBUG_FILE_NAME}/{DEBUG_IDENTIFIER}/{DEBUG_FILE_NAME_WITHOUT_PDB}.sym
{SYMBOLS_ROOT}
是所有符号文件的根文件夹。您可以将所有版本的 NW.sym
文件放在同一个文件夹中。{DEBUG_FILE_NAME}
、{DEBUG_IDENTIFIER}
和{DEBUG_FILE_NAME_WITHOUT_PDB}
可以从.sym
文件的第一行获得,该行通常类似于MODULE Linux x86_64 265BDB6BE043D5C70D3A1E279A8F0B1A0 nw
(对于 Mac,类似于MODULE mac x86_64 4E7C70708AFD3C889F02B149AB5007080 nwjs
)。265BDB6BE043D5C70D3A1E279A8F0B1A0
是{DEBUG_IDENTIFIER}
nw
是{DEBUG_FILE_NAME}
。{DEBUG_FILE_NAME_WITHOUT_PDB}
可以通过从{DEBUG_FILE_NAME}
中删除.pdb
扩展名来转换,该扩展名仅对 Windows 而言是必需的。
例如,在 Mac 上,使用 0.57.1
-symbols_root/ -nwjs/ -4E7C70708AFD3C889F02B149AB5007080/ -nwjs.sym -nwjs Framework/ -87A9EA49BC473F4C8B7817631E820BEB0/ -nwjs Framework.sym -nwjs Helper/ -5598EA295F4F36FDA21CB9A5B11B11AA0/ -nwjs Helper.sym
使用 minidump_stackwalk
解码 Minidump
minidump_stackwalk
可以使用 NW.js 构建,也可以直接从 breakpad 源代码在 Mac 和 Linux 上构建。或者,您也可以从 Windows 上的 Cygwin 安装预构建版本。
要从 minidump
文件中获取堆栈跟踪,请运行以下命令:
minidump_stackwalk minidump_file.dmp /path/to/symbols_root 2>&1
如果符号文件没有正确组织,您仍然可以从该工具中获取调用堆栈。但是您将看不到符号,并且在输出的最后一部分(“已加载模块”)中会显示警告,例如:
0x00240000 - 0x02b29fff nw.exe ??? (main) (WARNING: No symbols, nw.exe.pdb, 669008F7B6EE44058CBD5F21BEB5B5CFe)
触发崩溃以进行测试
为了测试崩溃转储功能,您可以使用 NW.js 提供的 API 故意触发崩溃:App.crashBrowser()
和 App.crashRenderer()
。它们分别会使浏览器进程和渲染器进程崩溃。